#include "gtrans.h"
#include "ui_gtrans.h"


void GTrans::modifSelection(const QItemSelection &selected, const QItemSelection &deselected)
{
    if(!isReloading){
        // les selectionnés
        int row = -1;
        int oldrow = -1;
        for(int i = 0; i< selected.indexes().count(); i++){
            row = selected.indexes().at(i).row();
            if(row != oldrow){
                int id = modelAgiosComptes->index(row,0).data().toInt();
                listExempts.append(id);
                oldrow = row;
            }

        }
        oldrow = -1;
        // les deselectionnés
        for(int i = 0; i< deselected.indexes().count(); i++){
            row = deselected.indexes().at(i).row();
            if(row != oldrow){
                int id = modelAgiosComptes->index(row,0).data().toInt();
                listExempts.removeAll(id);
                oldrow = row;
            }
        }
        majCompteurs();
    }
}

void GTrans::raffraichirApercuAgios()
{

    // ------------ Filtre permanent -------------
    QString f = "WHERE ";
    // Construction du WHERE proms
    f += "proms IN ('";

    // Récupération des proms
    QStringList listproms;

    for(int i =0; i < modelAgiosProms->rowCount() ;i++){

        if(ui->listAgiosProms->selectionModel()->isSelected(modelAgiosProms->index(i,0))){
            listproms << modelAgiosProms->index(i,0).data().toString();
        }

    }

    if(listproms.size() == 0){
        modelAgiosComptes->setQuery("");
        nbComptesAgios = 0;
        return;
    }

    f += listproms.join("','") + "') ";

    // Ajout de la clause actif
    if(!ui->checkAgiosPromsInactifs->isChecked()){
        f+= "AND actif = 1 ";
    }

    // Ajout du seuil
    f+= "AND solde < :s ";

    // ------------ Filtre temporaire -------------
    if(!ui->lineAgiosRechercheBucque->text().isEmpty()){
        f+= "AND bucque LIKE '%:b%' ";
    }
    if(ui->spinAgiosRechercheFams->value()>0){
        f+= "AND fams = :f ";
    }

    // ------------ Tri ------------------------
    f+= "ORDER BY proms, fams";

    // ------------ Création de la requète ------------------------

    QSqlQuery q(db);
    q.prepare(requeteBaseAgios+f);
    q.bindValue(":a",ui->spinAgiosCommandesAgios->value());
    q.bindValue(":s",ui->spinAgiosCommandesSeuil->value());
    if(!ui->lineAgiosRechercheBucque->text().isEmpty()){
        q.bindValue(":b",ui->lineAgiosRechercheBucque->text());
    }
    if(ui->spinAgiosRechercheFams->value()>0){
        q.bindValue(":f",ui->spinAgiosRechercheFams->value());
    }
    q.exec();
    modelAgiosComptes->setQuery(q);
    modelAgiosComptes->setHeaderData(0,Qt::Horizontal,"Id");
    modelAgiosComptes->setHeaderData(1,Qt::Horizontal,"Bucque");
    modelAgiosComptes->setHeaderData(2,Qt::Horizontal,"Fam's");
    modelAgiosComptes->setHeaderData(3,Qt::Horizontal,"Prom's");
    modelAgiosComptes->setHeaderData(4,Qt::Horizontal,"Actif");
    modelAgiosComptes->setHeaderData(5,Qt::Horizontal,"Solde actuel");
    modelAgiosComptes->setHeaderData(6,Qt::Horizontal,"Agios");
    modelAgiosComptes->setHeaderData(7,Qt::Horizontal,"Solde prev.");
    ui->tableAgiosApercu->resizeColumnsToContents();

    if(ui->lineAgiosRechercheBucque->text().isEmpty() && ui->spinAgiosRechercheFams->value()==0){
        nbComptesAgios = modelAgiosComptes->rowCount();
    }


    isReloading = true;
    // ----------- Raffraichir la selection -----------------
    ui->tableAgiosApercu->clearSelection();
    for(int i= 0; i< modelAgiosComptes->rowCount(); i++){
        if(listExempts.contains(modelAgiosComptes->index(i,0).data().toInt())){
            ui->tableAgiosApercu->selectRow(i);
        }
    }

    isReloading = false;

    majCompteurs();

}

void GTrans::majCompteurs()
{
    ui->labelAgiosNbExemptes->setText(QString::number(listExempts.count()));
    ui->labelAgiosNbComptes->setText(QString::number(nbComptesAgios-listExempts.count()));
}

void GTrans::on_buttonAgiosCommandesAppliquer_clicked()
{
    // On efface les filtres temporaires
    on_buttonAgiosApercu_clicked();

    // On demande confirmation
    if(QMessageBox::question(this,"Appliquer les agios","Des agios de " + ui->spinAgiosCommandesAgios->text() + " seront appliqués aux " + ui->labelAgiosNbComptes->text() + " compte(s) concerné(s). Etes vous sûr de vouloir continuer?") == QMessageBox::Yes){

        QSettings s;
        int compteAE = s.value("trans/compte",0).toInt();
        if(compteAE == 0){
            QMessageBox::critical(this,"Compte débiteur","Le compte débiteur pour les remises n'est pas défini.");
            return;
        }

        // On récupère fams proms du tonton
        QSqlQuery q1(db);
        q1.prepare("SELECT fams, proms FROM v_users WHERE id = :i");
        q1.bindValue(":i",idConnexion);
        q1.exec();
        q1.first();
        QString fams = q1.value(0).toString();
        QString proms = q1.value(1).toString();
        q1.finish();

        // On prépare la requète
        QSqlQuery q(db);
        q.prepare("CALL faire_transaction(:d,:c,:m,:l)");
        q.bindValue(":l","Agios "+ui->spinAgiosCommandesAgios->text()+" - Seuil "+ui->spinAgiosCommandesSeuil->text()+ " - Par "+fams+" "+proms);
        q.bindValue(":c",compteAE);

        QProgressDialog *dialog = new QProgressDialog("Application des agios :",0,0,modelAgiosComptes->rowCount(),this);
        dialog->setWindowModality(Qt::WindowModal);
        dialog->setValue(0);

        // On boucle sur le model
        for(int i = 0 ; i< modelAgiosComptes->rowCount(); i++){
            int id = modelAgiosComptes->index(i,0).data().toInt();
            if(!listExempts.contains(id) && id != compteAE ){
                q.bindValue(":d",id);
                q.bindValue(":m", 0 - modelAgiosComptes->index(i,6).data().toDouble());
                q.exec();
            }
            dialog->setValue(i+1);
        }

        dialog->close();
        dialog->deleteLater();

        q.finish();


    }

}

void GTrans::on_buttonAgiosApercu_clicked()
{
    ui->lineAgiosRechercheBucque->setText("");
    ui->spinAgiosRechercheFams->setValue(0);
    raffraichirApercuAgios();
}

void GTrans::on_buttonAgiosPromsRaffraichir_clicked()
{
    modelAgiosProms->setQuery("SELECT CONCAT(centre,' ',annee,statut) FROM promotions ORDER BY centre, annee",db);
}
